package com.superbytecode.cloud.common.utils;

import lombok.experimental.UtilityClass;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Objects;

/**
 * All rights Reserved, Designed By www.super-master.cn
 *
 * @ProjectName: sanskrit
 * @Package: com.superbytecode.sanskrit.core.utils
 * @ClassName: VerifyUtil
 * @Description: []
 * <p> </p>
 * @Author: [Lance Ting]
 * @Date: 2024/8/14 14:46
 * @Version: V1.0
 * @Copyright: 2024 www.super-master.cn Inc. All rights reserved.
 * TODO: 注意,本文件Lance Ting所作,如果转载或使用请标明具体出处!
 **/
@UtilityClass
public class VerifyUtil {

    public boolean nonNull(Object value) {
        return null != value;
    }

    public boolean isNull(Object value) {
        if (value instanceof String) {
            return "null".equals(value);
        }
        return null == value;
    }

    public boolean isEmpty(Object value) {
        return null == value || "".equals(value);
    }

    public boolean isNotEmpty(Object value) {
        return !isEmpty(value);
    }

    // ------------------------------------------------ value compare --------------------------------------------------

    /**
     * 比较值是否相等
     * <p>
     * 1、BigDecimal中的0.0和0的需要特殊处理
     * 2、比较值都为null，标识为false
     * </p>
     *
     * @param targetValue 目标值
     * @param sourceValue 原始值
     * @param <T>         约束类
     * @return true-相等，false-不相等
     */
    public <T> boolean compareDeepEquals(T targetValue, T sourceValue) {
        // 忽略null和字符串""之间的比较
        if (Objects.isNull(targetValue) && Objects.isNull(sourceValue)) {
            return false;
        }
        return compareEquals(targetValue, sourceValue);
    }

    /**
     * 比较值是否相等
     *
     * @param values 目标值
     * @param <T>    约束类
     * @return true-相等，false-不相等
     */
    @SafeVarargs
    public <T> boolean compareEquals(T... values) {
        AssertUtil.requireNonNull(values, "values must not be null");
        final T targetValue = values[0]; // 选取地址一个值作为比较对象
        return Arrays.stream(values).filter(Objects::nonNull).allMatch(v -> compareEquals(v, targetValue));
    }

    /**
     * 比较值是否相等
     * <p>
     * 1、BigDecimal中的0.0和0的需要特殊处理
     * </p>
     *
     * @param targetValue 目标值
     * @param sourceValue 原始值
     * @param <T>         约束类
     * @return true-相等，false-不相等
     */
    public <T> boolean compareEquals(T targetValue, T sourceValue) {
        // BigDecimal中的0.0和0的需要特殊处理
        if ((targetValue instanceof BigDecimal) && ((BigDecimal) targetValue).compareTo(((BigDecimal) sourceValue)) == 0) {
            return true;
        }
        return Objects.equals(targetValue, sourceValue);
    }
}